#include "jugador.h"

/*------------------------------------------------------------------------------
	Constructor
------------------------------------------------------------------------------*/
CJugador::CJugador()
{
	m_pControl=		 	NULL;
	m_pListaDisparos=	NULL;
	m_pListaParticulas=	NULL;
	m_pObjetos=			NULL;
	
	m_pRecursos=	 	NULL;
	m_bDisparoPulsado=	FALSE;
	//m_bSaltoPulsado=	FALSE;
	//m_eTipoDisparo=DISPARO_SHURIKEN;
	m_eTipoDisparo=DISPARO_SHURIKEN_FUEGO;
	//m_eTipoDisparo=DISPARO_KUNAI;
	//m_eTipoDisparo=DISPARO_KUNAI_FUEGO;
}

/*------------------------------------------------------------------------------
	Destructor
------------------------------------------------------------------------------*/
CJugador::~CJugador()
{
}

/*------------------------------------------------------------------------------
	Free memory function
------------------------------------------------------------------------------*/
void CJugador::Liberar()
{
	m_pControl=		 	NULL;
	m_pListaDisparos=	NULL;
	m_pListaParticulas=	NULL;
	m_pObjetos=			NULL;	
	m_pRecursos=	 	NULL;
	CPersonaje::Liberar();
}

/*------------------------------------------------------------------------------
	Draws character
------------------------------------------------------------------------------*/
void CJugador::Dibujar()
{
	Controlar();
	CPersonaje::Actualizar();
}

/*------------------------------------------------------------------------------
	Player controls
------------------------------------------------------------------------------*/
void CJugador::Controlar(){

	if(!m_pControl)
		return;
		
	m_pControl->Actualizar();
	
	switch(getEstado())
	{
		//--------------------------------------
		case ESTADO_PJ_NORMAL:			
		
			if(m_pControl->YaPulsada(DISPARO))
			{				
				setVelocX(0);
				setEstado(ESTADO_PJ_ATAQUE);
			}
			
			
			if(m_pControl->Pulsada(DERECHA))
			{	
				setRotZ(GRADOS_DERECHA);
				setVelocX(VELOCIDAD_X);				
				setEstado(ESTADO_PJ_CORRER);
			}
						
			if(m_pControl->Pulsada(IZQUIERDA))
			{	
				setRotZ(GRADOS_IZQUIERDA);
				setVelocX(-VELOCIDAD_X);
				setEstado(ESTADO_PJ_CORRER);
			}
						
			if(m_pControl->Pulsada(SALTO))
			{					
				setVelocY(VELOCIDAD_SALTOY);
				setEstado(ESTADO_PJ_SALTO);
			}			
			
			if(m_pControl->Pulsada(ABAJO))
			{					
				setVelocY(0);
				setVelocX(0);
//				setEstado(12);
				setEstado(ESTADO_PJ_AGACHADO);
			}	
		break;
		//--------------------------------------
		case ESTADO_PJ_CORRER:
		
			if(m_pControl->Pulsada(DISPARO))
			{					
				setVelocX(0);
				setEstado(ESTADO_PJ_ATAQUE);
			}
			if((getRotZ()==GRADOS_DERECHA 	&& !m_pControl->Pulsada(DERECHA)) ||			
			   (getRotZ()==GRADOS_IZQUIERDA && !m_pControl->Pulsada(IZQUIERDA)))
			{	
				setEstado(ESTADO_PJ_NORMAL);
				setVelocX(0);			
			}
			if(m_pControl->Pulsada(SALTO))
			{					
				setVelocY(VELOCIDAD_SALTOY);
				setEstado(ESTADO_PJ_SALTO);
			}			
					
		break;
		//--------------------------------------
		case ESTADO_PJ_SALTO:							
			if((m_pControl->Pulsada(DERECHA)))
			{	
				setRotZ(GRADOS_DERECHA);
				setVelocX(VELOCIDAD_SALTOX);				
			}
			
			if((m_pControl->Pulsada(IZQUIERDA)))
			{	
				setRotZ(GRADOS_IZQUIERDA);
				setVelocX(-VELOCIDAD_SALTOX);
			}
			
			if(m_pControl->Pulsada(DISPARO))
			{					
				setEstado(ESTADO_PJ_ATAQUE_SALTO);
			}
						
		break;
		//--------------------------------------
		case ESTADO_PJ_ATAQUE:
		
			if(getFrameActual()==FRAME_DISPARO)
			{
				if(!m_pObjetos) 
					break;
					
				CDisparo *d;
				CParticulas *p;
				d=new CDisparo();
				
				p=d->Iniciar(m_pRecursos,
							this,
							getEscenario(),							
							m_eTipoDisparo,
							getX()+(0.2*((90-getRotZ())/90)),
							getY()+0.025,
							getZ());
				if(p!=NULL)
					m_pObjetos->AniadirParticula(p);
					
				//m_pListaDisparos->Insertar(d);				
				m_pObjetos->AniadirDisparo(d);				
				d=NULL;
			}	
		break;
		//--------------------------------------
		case ESTADO_PJ_AGACHADO:
		
			if(m_pControl->YaPulsada(DISPARO))
			{					
				setEstado(ESTADO_PJ_ATAQUE_AGACHADO);
			}
			
			if(!m_pControl->Pulsada(ABAJO))	   
			{	
				setEstado(ESTADO_PJ_NORMAL);				
			}				
			
			if(m_pControl->Pulsada(SALTO) && SobrePlataforma())
			{	
				setY(getY()-0.05);
				HacerCaer();
			}	
		break;
		
		//--------------------------------------
		case ESTADO_PJ_ATAQUE_AGACHADO:
		
			if(getFrameActual()==FRAME_DISPARO_AGACHADO)
			{
				if(!m_pObjetos) 
					break;
					
				CDisparo *d;
				d=new CDisparo();
				CParticulas *p;
				p=d->Iniciar(m_pRecursos,
							 this,
							 getEscenario(),
							 m_eTipoDisparo,
							 getX()+(0.2*((90-getRotZ())/90)),
							 getY()-0.08,
							 getZ());
				if(p!=NULL)
					m_pObjetos->AniadirParticula(p);				
//					m_pListaParticulas->Insertar(p);
				
				m_pObjetos->AniadirDisparo(d);				
//				m_pListaDisparos->Insertar(d);				
				d=NULL;
			}	
		break;
		//--------------------------------------
		case ESTADO_PJ_ATAQUE_SALTO:
		
			if(getFrameActual()==FRAME_DISPARO_SALTO)
			{
				if(!m_pObjetos) 
					break;
					
				CDisparo *d;
				d=new CDisparo();
				CParticulas *p;
				p=d->Iniciar(m_pRecursos,
							 this,
							 getEscenario(),							
							 m_eTipoDisparo,
							 getX()+(0.2*((90-getRotZ())/90)),
							 getY(),
							 getZ());
							
				if(p!=NULL)
					m_pObjetos->AniadirParticula(p);				
//					m_pListaParticulas->Insertar(p);

				m_pObjetos->AniadirDisparo(d);				
//				m_pListaDisparos->Insertar(d);				
				d=NULL;
			}	
		break;
		//--------------------------------------
		default:
		break;

	}
}

